package morenoapp.components.input;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import morenoapp.MorenoApp;
import morenoapp.model.data.MorenoModelFace;
import morenoapp.model.data.MorenoRespondentFace;

/**
 * Редактор одного ответа.
 * @author dmitry.mamonov
 */
public class InputSingleAnswerEditor extends JTextField {
    /**
     * Шрифт для отрисовки значения не совпадающего ни с одним из выборов.
     */
    private Font plainFont;

    /**
     * Шрифт для отрисовки значения совпадающего с одним из выборов.
     */
    private Font boldFont;

    /**
     * Наиболее подходящий кандидат под введённое значение.
     */
    private MorenoRespondentFace completition = null;

    /**
     * Редактор должен пропускать данное знаение при вводе.
     */
    private MorenoRespondentFace passValue = null;

    public InputSingleAnswerEditor() {
        super();

        //Выбираем шрифты
        plainFont = getFont();
        boldFont = new Font(plainFont.getName(), Font.BOLD, plainFont.getSize());

        //Устанавливаем слушателя документа для определения того,
        //Быбран ли какой либо респондент или нет.
        this.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                changed(e);
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                changed(e);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                changed(e);
            }

            private void changed(DocumentEvent e) {
                final String matchString = getText();
                MorenoRespondentFace target = null;
                if (!matchString.isEmpty()) {
                    for (MorenoRespondentFace respondent : getModel().getRespondentsList()) {
                        if (respondent!=passValue && respondent.getName().toLowerCase().startsWith(matchString.toLowerCase())) {
                            target = respondent;
                            break;
                        }
                    }
                }
                setCompletition(target);
            }
        });
    }

    private MorenoModelFace getModel() {
        return MorenoApp.getModel();
    }

    public MorenoRespondentFace getSelectedRespondent() {
        return getCompletition();
    }

    public void setSelectedRespondent(MorenoRespondentFace respondent) {
        setText(respondent != null ? respondent.getName() : "");
    }

    public boolean isCompletitionAvailable() {
        return getCompletition() != null;
    }

    private MorenoRespondentFace getCompletition() {
        return completition != passValue ? completition : null;
    }

    public void setPassValue(MorenoRespondentFace passValue){
        this.passValue = passValue;
    }

    private void setCompletition(MorenoRespondentFace completition) {
        this.completition = completition;
    }

    @Override
    public void paint(Graphics g) {
        //System.out.println("paint " + System.currentTimeMillis());
        String text = getText();
        if (completition != null && text.equals(completition.getName())) {
            setFont(boldFont);
        } else {
            setFont(plainFont);
        }

        super.paint(g);

        if (completition != null && completition.getName().length() > text.length()) {
            int pos = g.getFontMetrics().stringWidth(text);
            int baseline = getBaseline(getWidth(), getHeight());

            g.setColor(Color.GRAY);
            g.drawString(completition.getName().substring(text.length()), pos + getInsets().left, baseline);
        }
    }
}
